package service;

import java.util.ArrayList;

import bean.Fabricante;
import bean.Pais;
import bean.Producto;
import bean.Rodamiento;
import bean.VOList;
import bean.vo.ProductoVO;

@SuppressWarnings({"unchecked"})
public abstract class ServiciosProducto {
	
	protected static Producto buscarProducto(String codigoRodamiento, String sufijoRodamiento, String paisOrigen, String fabricante) throws Exception { 
		Rodamiento r = ServiciosRodamiento.buscarRodamiento(codigoRodamiento, sufijoRodamiento);
		if (r == null)
			throw new Exception("Error - no existe rodamiento con el codigo/sufijo ingresado");
		
		Pais o = ServiciosPais.buscarPais(paisOrigen);
		if (o == null)
			throw new Exception("Error - no existe pais con el nombre ingresado");
		
		Fabricante f = ServiciosFabricante.buscarFabricante(fabricante);
		if (f == null)
			throw new Exception("Error - no existe fabricante con el nombre ingresado");
 		
		return (Producto) SistemaCVR.getInstancia().buscarEntidad(new Producto(r, o, f));
	}
	
	public static ProductoVO buscarProducto(ProductoVO p) throws Exception {
		Producto prod = ServiciosProducto.buscarProducto(p.getRodamiento().getCodigo(), p.getRodamiento().getSufijo(), p.getOrigen().getNombre(), p.getFabricante().getNombre());
		return prod != null ? prod.getVO() : null;
	}
	
	public static ArrayList<ProductoVO> getProductos() throws Exception{
		return new VOList<ProductoVO>().getVoList(SistemaCVR.getInstancia().getEntidades(Producto.class.getName()));
	}
	
	public static void crearProducto(ProductoVO p) throws Exception {
		if (ServiciosProducto.buscarProducto(p) == null) {
			Rodamiento r = ServiciosRodamiento.buscarRodamiento(p.getRodamiento().getCodigo(), p.getRodamiento().getSufijo());
			Pais o = ServiciosPais.buscarPais(p.getOrigen().getNombre());
			Fabricante f = ServiciosFabricante.buscarFabricante(p.getFabricante().getNombre());
			if (r == null || o == null || f == null){
	 			throw new Exception("ERROR - Rodamiento/Origen/Fabricante invalidos.");
	 		}
			
			Producto prod = new Producto(r, o, f);
			prod.setPrecio(p.getPrecio());
			prod.setStock(p.getStock());
			SistemaCVR.getInstancia().agregarEntidad(prod);
		} else {
			throw new Exception("ERROR - Ya existe un producto para el Rodamiento/Origen/Fabricante ingresados.");
		}
	}
	
	public static void eliminarProducto(ProductoVO p) throws Exception {
		Producto prod = ServiciosProducto.buscarProducto(p.getRodamiento().getCodigo(), p.getRodamiento().getSufijo(), p.getOrigen().getNombre(), p.getFabricante().getNombre());
		if (prod != null ){
			SistemaCVR.getInstancia().eliminarEntidad(prod);
		}else {
			throw new Exception("ERROR - No se encuentra el producto que se desea eliminar.");
		}
	}
	
	public static void modificarProducto(ProductoVO p) throws Exception {
		Producto prod = ServiciosProducto.buscarProducto(p.getRodamiento().getCodigo(), p.getRodamiento().getSufijo(), p.getOrigen().getNombre(), p.getFabricante().getNombre());
		if (prod != null ){
			prod.setStock(p.getStock());
			SistemaCVR.getInstancia().modificarEntidad(prod);
		}else {
			throw new Exception("ERROR - Producto no encontrador.");
		}
	}
}
